const fs = require('fs-extra');
const path = require('path');
const { createLogger } = require('./logger');

// 创建日志记录器
const logger = createLogger('file-helper');

/**
 * 获取文件的 Content-Type
 * @param {string} filePath 文件路径
 * @returns {string} Content-Type
 */
function getContentType(filePath) {
  const extension = path.extname(filePath).toLowerCase();
  const contentTypes = {
    '.html': 'text/html',
    '.css': 'text/css',
    '.js': 'application/javascript',
    '.json': 'application/json',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.jpeg': 'image/jpeg',
    '.gif': 'image/gif',
    '.svg': 'image/svg+xml',
    '.ico': 'image/x-icon',
    '.woff': 'font/woff',
    '.woff2': 'font/woff2',
    '.ttf': 'font/ttf',
    '.eot': 'application/vnd.ms-fontobject',
    '.otf': 'font/otf',
    '.txt': 'text/plain',
    '.xml': 'application/xml',
    '.pdf': 'application/pdf',
    '.zip': 'application/zip',
    '.map': 'application/json'
  };
  
  return contentTypes[extension] || 'application/octet-stream';
}

/**
 * 获取缓存控制策略
 * @param {string} filePath 文件路径
 * @param {string} strategy 缓存策略
 * @returns {string} Cache-Control 头
 */
function getCacheControl(filePath, strategy) {
  const extension = path.extname(filePath).toLowerCase();
  
  // HTML 文件通常不缓存或短期缓存
  const isHtml = extension === '.html';
  
  switch (strategy) {
    case 'no-cache':
      return 'no-cache, no-store, must-revalidate';
    case 'short':
      return 'max-age=3600, public'; // 1小时
    case 'long':
      return 'max-age=31536000, public'; // 1年
    case 'default':
    default:
      // 默认策略：HTML 文件不缓存，其他文件长期缓存
      return isHtml ? 'no-cache, no-store, must-revalidate' : 'max-age=31536000, public';
  }
}

/**
 * 递归获取目录下的所有文件
 * @param {string} dirPath 目录路径
 * @returns {string[]} 文件路径数组
 */
function getAllFiles(dirPath) {
  const files = [];
  const items = fs.readdirSync(dirPath);
  
  for (const item of items) {
    const fullPath = path.join(dirPath, item);
    const stat = fs.statSync(fullPath);
    
    if (stat.isFile()) {
      files.push(fullPath);
    } else if (stat.isDirectory()) {
      files.push(...getAllFiles(fullPath));
    }
  }
  
  return files;
}

/**
 * 确保目录存在
 * @param {string} dirPath 目录路径
 */
function ensureDir(dirPath) {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath, { recursive: true });
    logger.info(`创建目录: ${dirPath}`);
  }
}

/**
 * 读取JSON配置文件
 * @param {string} filePath 文件路径
 * @param {object} defaultValue 默认值
 * @returns {object} 配置对象
 */
function readJsonConfig(filePath, defaultValue = {}) {
  try {
    if (!fs.existsSync(filePath)) {
      return defaultValue;
    }
    return fs.readJSONSync(filePath);
  } catch (error) {
    logger.error(`读取配置文件失败: ${filePath}`, error);
    return defaultValue;
  }
}

/**
 * 保存JSON配置文件
 * @param {string} filePath 文件路径
 * @param {object} data 配置数据
 * @returns {boolean} 是否成功
 */
function saveJsonConfig(filePath, data) {
  try {
    fs.writeJSONSync(filePath, data, { spaces: 2 });
    return true;
  } catch (error) {
    logger.error(`保存配置文件失败: ${filePath}`, error);
    return false;
  }
}

module.exports = {
  getContentType,
  getCacheControl,
  getAllFiles,
  ensureDir,
  readJsonConfig,
  saveJsonConfig
}; 